package db

import (
	"fmt"
	"go-iot-project/pkg/log"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	gormlog "gorm.io/gorm/logger"
)

var MyDb *gorm.DB

type MySqlConfig struct {
	Host         string `mapstructure:"host" json:"host" yaml:"host"`
	Config       string `mapstructure:"config" json:"config" yaml:"config"`
	Database     string `mapstructure:"database" json:"database" yaml:"database"`
	Username     string `mapstructure:"username" json:"username" yaml:"username"`
	Password     string `mapstructure:"password" json:"password" yaml:"password"`
	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns"`
	MaxOpenConns int    `mapstructure:"max-open-conns" json:"max-open-connection" yaml:"max-open-conns"`
}

// Open 创建数据库连接
func Open(m *MySqlConfig) {
	host := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s",
		m.Username,
		m.Password,
		m.Host,
		m.Database,
		m.Config)
	log.Infof("连接mysql [%s]", host)

	mysqlConfig := mysql.Config{
		DSN:                       host,  // host
		DefaultStringSize:         200,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}
	ormConfig := &gorm.Config{Logger: gormlog.Default.LogMode(gormlog.Silent)}

	db, err := gorm.Open(mysql.New(mysqlConfig), ormConfig)
	if err != nil {
		panic(fmt.Sprintf("连接mysql失败! [%s]", err.Error()))
	}
	sqlDB, _ := db.DB()
	sqlDB.SetMaxIdleConns(m.MaxIdleConns)
	sqlDB.SetMaxOpenConns(m.MaxOpenConns)

	MyDb = db
}
